package modulo1.cgt;

import java.util.List;
import modulo1.cdp.*;
import modulo1.cgd.AulaDaoJpa;
import modulo1.cgd.MatriculaDaoJpa;
import modulo1.cgd.TurmaDaoJpa;

/**
 *
 * @author Todo poderoso Victor
 */
public class ControleTurmaMatriculaApl {

    static ControleTurmaMatriculaApl instance;

    public static ControleTurmaMatriculaApl getInstance() {
        if (instance == null) {
            instance = new ControleTurmaMatriculaApl();
        }
        return instance;
    }

    /*
     *
     * CADASTRO DE TURMA
     *
     */
    public void turmaSalvar(Turma t) throws Exception {
        try {
            TurmaDaoJpa cdj = new TurmaDaoJpa();
            if (t.getEstado().equals(EnumEstadoTurma.ENCERRADA)) {
                List<Matricula> matriculas = t.getListaMatriculas();
                for (Matricula matricula : matriculas) {
                    matricula.setFrequenciaFinal((matricula.getListaAulas().size() * 100 / t.getListaAulas().size()));
                    matricular(matricula);
                }
            }
            cdj.salvar(t);
        } catch (Exception ex) {
            t.setEstado(EnumEstadoTurma.INICIADA);
            throw new Exception("Erro ao salvar turma.");
        }
    }

    public void turmaExcluir(Long id) throws Exception {
        //TODO validarExcluirTurma
        try {
            TurmaDaoJpa cdj = new TurmaDaoJpa();
            Turma t = new Turma();
            t.setId(id);
            t = cdj.consultar(t);
            cdj.excluir(t);
        } catch (Exception ex) {
            throw new Exception("Erro ao excluir turma.");
        }
    }

    public Turma turmaConsultar(Long id) throws Exception {
        try {
            TurmaDaoJpa cdj = new TurmaDaoJpa();
            Turma t = new Turma();
            t.setId(id);
            t = cdj.consultar(t);
            return t;
        } catch (Exception ex) {
            throw new Exception("Erro ao consultar turma.");
        }
    }

    public List<Turma> turmaBuscar() throws Exception {
        try {
            TurmaDaoJpa cdj = new TurmaDaoJpa();
            return cdj.buscar(new Turma());
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao buscar turma.");
        }
    }

    public List<Turma> turmaBuscarAberta() throws Exception {
        try {
            TurmaDaoJpa cdj = new TurmaDaoJpa();
            return cdj.buscarAberta();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao buscar turma.");
        }
    }

    public List<Turma> turmaBuscarLiberada() throws Exception {
        try {
            TurmaDaoJpa cdj = new TurmaDaoJpa();
            return cdj.buscarLiberada();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao buscar turma.");
        }
    }

    public List<Turma> turmaBuscarEncerrada() throws Exception {
        try {
            TurmaDaoJpa cdj = new TurmaDaoJpa();
            return cdj.buscarEncerrada();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao buscar turma.");
        }
    }

    public List<Turma> turmaBuscarAno(int ano) throws Exception {
        try {
            TurmaDaoJpa cdj = new TurmaDaoJpa();
            return cdj.buscarAno(ano);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao buscar turma.");
        }
    }

    /*
     *
     * CADASTRO DE MATRICULA
     *
     */
    public List<Matricula> matriculaBuscar() throws Exception {
        try {
            MatriculaDaoJpa mdj = new MatriculaDaoJpa();
            return mdj.buscar();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao buscar matrícula.");
        }
    }

    public List<Matricula> matriculaBuscarAno(int ano) throws Exception {
        try {
            MatriculaDaoJpa mdj = new MatriculaDaoJpa();
            return mdj.buscarAno(ano);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao buscar matrícula.");
        }
    }

    public void matricular(Matricula matricula) throws Exception {
        try {
            MatriculaDaoJpa mdj = new MatriculaDaoJpa();
            mdj.salvar(matricula);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao salvar matrícula.");
        }
    }

    public void desmatricular(Matricula matricula) throws Exception {
        try {
            MatriculaDaoJpa mdj = new MatriculaDaoJpa();
            mdj.excluir(matricula);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao excluir matrícula.");
        }
    }

    public Matricula matriculaConsultar(Turma turma, Aluno aluno) throws Exception {
        try {
            MatriculaDaoJpa mdj = new MatriculaDaoJpa();
            return mdj.consultar(turma, aluno);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao excluir matrícula.");
        }
    }

    public Matricula matriculaConsultar(Long id) throws Exception {
        try {
            MatriculaDaoJpa mdj = new MatriculaDaoJpa();
            Matricula m = new Matricula();
            m.setId(id);
            return mdj.consultar(m);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao consultar matrícula.");
        }
    }

    public List<Matricula> matriculaConsultar(Aluno aluno) throws Exception {
        try {
            MatriculaDaoJpa mdj = new MatriculaDaoJpa();
            return mdj.consultar(aluno);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao consultar matrícula.");
        }
    }
    /*
     *
     * CADASTRO DE AULA
     *
     */

    public void aulaSalvar(Aula aula) throws Exception {
        try {
            AulaDaoJpa adj = new AulaDaoJpa();
            adj.salvar(aula);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao salvar aula.");
        }
    }

    public List<Aula> aulaBuscar(Turma turma) throws Exception {
        try {
            AulaDaoJpa adj = new AulaDaoJpa();
            return adj.buscarTurma(turma);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao salvar aula.");
        }
    }

    public Aula aulaConsultar(Long id) throws Exception {
        try {
            AulaDaoJpa adj = new AulaDaoJpa();
            Aula aula = new Aula();
            aula.setId(id);
            return adj.consultar(aula);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception("Erro ao salvar aula.");
        }
    }
}
